/*
 * ============================================================================
 *                   GNU Lesser General Public License
 * ============================================================================
 *
 *
 *
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
 * 
 *
 *
 */
package rad.framework.trace;

import org.jboss.aop.joinpoint.MethodInvocation;

import com.jamonapi.Monitor;
import com.jamonapi.MonitorFactory;

/**
 * JBoss AOP aspect for collecting performance statistics.
 * 
 * set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME% -javaagent:pluggable-instrumentor.jar 
 * copy pluggable-instrumentor.jar to bin
 * EnableLoadtimeWeaving = true
 * 
 * @author boudyacho
 */
public class JamonPerformanceAspect {

	public Object invoke(MethodInvocation invocation) throws Throwable {
		Class<?> clazz;
		if (invocation.getTargetObject() == null) {
			clazz = invocation.getMethod().getDeclaringClass();
		} else {
			clazz = invocation.getTargetObject().getClass();
		}

		Monitor monitor = MonitorFactory.start(clazz.getName() + "."
				+ invocation.getMethod().getName());

		try {
			return invocation.invokeNext();
		} finally {
			monitor.stop();
		}
	}

//	public Object construct(ConstructorInvocation invocation) throws Throwable {
//		MonitorFactory.add(invocation.getTargetObject().getClass()
//				.getName(), "construct", 1);
//		return invocation.invokeNext();
//	}
}